function A401()
format long;

% k近邻法
% kNN根据给定距离度量，在训练集D中找出与x最近邻的k个点。

% 使用不同的距离指标比较kNN
% 使用不同的距离指标训练两个KDTreeSearcher模型，并比较两个模型的查询数据的kNN。
% 加载Fisher虹膜数据集。将花瓣测量值视为预测因子。
load fisheriris
X = meas(:, 3:4);                                        % 预测
Y = species;                                             % 响应
% 使用预测变量训练KDTreeSearcher模型对象。用指数5指定Minkowski距离。
KDTreeMdl = KDTreeSearcher(X, 'Distance', 'minkowski', 'P', 5);

% 求从X到查询点（新点）的10个最近邻，首先使用Minkowski，然后使用Chebychev距离度量。
% 查询点必须与用于训练模型的数据具有相同的列维度。
newpoint = [5 1.45];
[IdxMk, DMk] = knnsearch(KDTreeMdl, newpoint, 'k', 10);
[IdxCb, DCb] = knnsearch(KDTreeMdl, newpoint, 'k', 10, 'Distance', 'chebychev');
% IdxMk和IdxCb是1×10矩阵，包含X的行索引，对应于分别使用Minkowski和Chebychev距离的最近邻到新点。

% 绘制训练数据、查询点和最近邻。
figure;
gscatter(X(:, 1), X(:, 2), Y);
title('Fisher''s Iris Data -- Nearest Neighbors');
xlabel('Petal length (cm)');
ylabel('Petal width (cm)');
hold on
plot(newpoint(1), newpoint(2), 'kx', 'MarkerSize', 10, 'LineWidth', 2);        % 查询点 
plot(X(IdxMk, 1), X(IdxMk, 2), 'o', 'Color', [.5 .5 .5], 'MarkerSize', 10);    % Minkowski最近邻
plot(X(IdxCb, 1), X(IdxCb, 2), 'p', 'Color', [.5 .5 .5], 'MarkerSize', 10);    % Chebychev最近邻
legend('setosa', 'versicolor', 'virginica', 'query point', 'minkowski', 'chebychev', 'Location', 'Best');
hold off

% 使用模糊C均值聚类分析的聚类数据
% 将鸢尾花数据集用于聚类分析
% 使用花瓣长度和宽度作为特征
X_fcm = meas(:, 3:4);  % 使用花瓣长度和宽度
% 使用模糊C均值聚类查找3个聚类
[centers, U] = fcm(X_fcm, 3);
% 将每个数据点分类到具有最大成员值的群集中
[~, index] = max(U);
% 根据隶属度将数据点分类到不同的聚类
[~, sortedIdx] = sort(centers(:, 1));  % 根据x坐标排序聚类中心
% 创建一个新的index数组，重新指定每个数据点的聚类标签
newIndex = zeros(size(index));
newIndex(index == sortedIdx(1)) = 1;  % 聚类1为setosa
newIndex(index == sortedIdx(2)) = 2;  % 聚类2为versicolor
newIndex(index == sortedIdx(3)) = 3;  % 聚类3为virginica
% 根据新的index将数据点分配到不同的聚类
index1 = find(newIndex == 1);
index2 = find(newIndex == 2);
index3 = find(newIndex == 3);

% 绘制聚类数据和聚类中心
figure;
title('Fisher''s Iris Data -- Fuzzy C-Means Clustering');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
hold on
plot(X_fcm(index1, 1), X_fcm(index1, 2), 'or')  % setosa
plot(X_fcm(index2, 1), X_fcm(index2, 2), 'og')  % versicolor
plot(X_fcm(index3, 1), X_fcm(index3, 2), 'ob')  % virginica
plot(centers(sortedIdx(1), 1), centers(sortedIdx(1), 2), 'xr', 'MarkerSize', 10, 'LineWidth', 3)  % setosa的中心
plot(centers(sortedIdx(2), 1), centers(sortedIdx(2), 2), 'xg', 'MarkerSize', 10, 'LineWidth', 3)  % versicolor的中心
plot(centers(sortedIdx(3), 1), centers(sortedIdx(3), 2), 'xb', 'MarkerSize', 10, 'LineWidth', 3)  % virginica的中心
legend('setosa', 'versicolor', 'virginica', 'setosa center', 'versicolor center', 'virginica center', 'Location', 'Best');
hold off

end
